mix.exs
如同一般的elixir專案,記錄了相關的資訊,且可以在 deps 內看到,Phoenix已經把許多 web 相關的套件給加進來了。
其中包刮了 ecto 以及之前提到的 cowboy,以及html的模板工具等套件
  defp deps do
    [
      {:phoenix, "~> 1.5.3"},
      {:phoenix_ecto, "~> 4.1"},
      {:ecto_sql, "~> 3.4"},
      {:postgrex, ">= 0.0.0"},
      {:phoenix_html, "~> 2.11"},
      {:phoenix_live_reload, "~> 1.2", only: :dev},
      {:phoenix_live_dashboard, "~> 0.2.0"},
      {:telemetry_metrics, "~> 0.4"},
      {:telemetry_poller, "~> 0.4"},
      {:gettext, "~> 0.11"},
      {:jason, "~> 1.0"},
      {:plug_cowboy, "~> 2.0"}
    ]
  end
而依照慣例,專案的程式邏輯或放在lib目錄下
lib/sample_project/application.ex
在這個檔案中,定義了我們專案運行後需要啟用的所有服務,是這個專案最上層的模組。
children中的模組會透過監督樹的機制開始運行,在運行失敗時會被母節點重新啟動。
children = [
      # Ecto repository 模組
      SampleProject.Repo,
      # Web樣板相關的模組
      SampleProjectWeb.Telemetry,
      # Start the PubSub system
      {Phoenix.PubSub, name: SampleProject.PubSub},
      # Web相關的模組的進入點
      SampleProjectWeb.Endpoint
      # Start a worker by calling: SampleProject.Worker.start_link(arg)
      # {SampleProject.Worker, arg}
    ]
lib/sample_project_web.ex
web相關模組們的進入點,包刮 controllers, views, router 等,若是共用邏輯,可以寫在這邊。
  def controller do
    quote do
      use Phoenix.Controller, namespace: SampleProjectWeb
      import Plug.Conn
      import SampleProjectWeb.Gettext
      alias SampleProjectWeb.Router.Helpers, as: Routes
    end
  end
.......
.......
lib/sample_project_web
這個目錄存放了web相關的模組,包刮controllers, views, router等。
當我們在瀏覽器下了一個請求後,他會進入lib/sample_project_web/router.ex 匹配對應的路由,例如
http://localhost:4000/ 會匹配到 PageController 下的 index 這個函式。
lib/sample_project_web/controllers/page_controller.ex
scope "/", SampleProjectWeb do
    pipe_through :browser
    get "/", PageController, :index
  end
然後,經過 render 這個函式指定要渲染的模板,並且會對應到同 controller 名稱的資料夾下的模板,例如這邊會對應到 page/index.eex,eex 是 Phoenix 所指用的模板語言,夠過這種方式,可以把資料渲染到畫面上。
  def index(conn, _params) do
    render(conn, "index.html")
  end

最終變會顯示頁面了。